﻿using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;

namespace BW.MesProject.Public.Infrastructure
{
    /// <summary>
    /// 通用仓储基类，实现了IBaseRepository接口，提供基本的数据操作方法。
    /// </summary>
    /// <typeparam name="T">实体类型，必须为类且有无参构造函数。</typeparam>
    public class BaseRepository<T> : IBaseRepository<T> where T : class, new()
    {
        private readonly ISqlSugarClient _sqlSugarClient;

        public BaseRepository(ISqlSugarClient sqlSugarClient)
        {
            this._sqlSugarClient = sqlSugarClient;
        }
        /// <summary>
        /// 新增实体到数据库。
        /// </summary>
        /// <param name="entity">要新增的实体对象。</param>
        /// <returns>受影响的行数。</returns>
        public int Add(T entity)
        {
            return _sqlSugarClient.Insertable(entity).ExecuteCommand();
        }
        /// <summary>
        /// 删除数据库中的实体。
        /// </summary>
        /// <param name="entity">要删除的实体对象。</param>
        /// <returns>受影响的行数。</returns>
        public int Delete(T entity)
        {
            return _sqlSugarClient.Deleteable(entity).ExecuteCommand();
        }

        /// <summary>
        /// 根据条件获取实体集合的查询对象。
        /// </summary>
        /// <param name="expression">筛选条件表达式。</param>
        /// <returns>可进一步查询的ISugarQueryable对象。</returns>
        public ISugarQueryable<T> GetAll()
        {
            return _sqlSugarClient.Queryable<T>();
        }

        /// <summary>
        /// 根据条件获取单个实体对象。
        /// </summary>
        /// <param name="expression">筛选条件表达式。</param>
        /// <returns>符合条件的实体对象，如果不存在则返回null。</returns>
        public T GetValue(Expression<Func<T, bool>> expression)
        {
            return _sqlSugarClient.Queryable<T>().First(expression);
        }

        /// <summary>
        /// 更新数据库中的实体。
        /// </summary>
        /// <param name="entity">要更新的实体对象。</param>
        /// <returns>受影响的行数。</returns>
        public int Update(T entity)
        {
            return _sqlSugarClient.Updateable(entity).ExecuteCommand();
        }

    }
}
